home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.3 (Developer)…68k, x86, SPARC, PA-RISC] / NeXTSTEP 3.3 Dev Intel.iso / NextDeveloper / Headers / bsd / dev / scsireg.h < prev    next >
Text File  |  1995-02-14  |  22KB  |  805 lines

  1. /*    @(#)scsireg.h    1.0    10/23/89    (c) 1989 NeXT    */
  2. /*
  3.  * scsireg.h -- generic SCSI definitions
  4.  * KERNEL VERSION
  5.  *
  6.  * HISTORY
  7.  * 10-Feb-93       dmitch
  8.  *    Added generic endian/alignment #ifdef's.
  9.  * 17-May-90    dmitch
  10.  *    Added SDIOCGETCAP
  11.  * 30-Apr-90    dmitch
  12.  *    Added C6S_SS_START, C6S_SS_STOP, C6S_SS_EJECT, SR_IOST_VOLNA
  13.  * 30-Oct-89    dmitch
  14.  *    Deleted private #defines (--> scsivar.h)
  15.  * 25-Sep-89    dmitch at NeXT
  16.  *    Added scsi_req, support for sg and st drivers
  17.  * 10-Sept-87      Mike DeMoney (mike) at NeXT
  18.  *    Created.
  19.  */
  20.  
  21. #ifndef _BSD_DEV_SCSIREG_
  22. #define    _BSD_DEV_SCSIREG_
  23.  
  24. #import <sys/ioctl.h>
  25. #import <sys/time.h>
  26. #import <kernserv/queue.h>
  27. #import <sys/types.h>
  28.  
  29. /*
  30.  * status byte definitions
  31.  */
  32. #define    STAT_GOOD        0x00    /* cmd successfully completed */
  33. #define    STAT_CHECK        0x02    /* abnormal condition occurred */
  34. #define    STAT_CONDMET        0x04    /* condition met / good */
  35. #define    STAT_BUSY        0x08    /* target busy */
  36. #define    STAT_INTMGOOD        0x10    /* intermediate / good */
  37. #define    STAT_INTMCONDMET    0x14    /* intermediate / cond met / good */
  38. #define    STAT_RESERVED        0x18    /* reservation conflict */
  39.  
  40. #define    STAT_MASK        0x1e    /* clears vendor unique bits */
  41.  
  42.  
  43. /*
  44.  * SCSI command descriptor blocks
  45.  * (Any device level driver doing fancy things will probably define
  46.  * these locally and cast a pointer on top of the sd_cdb.  We define
  47.  * them here to reserve the appropriate space, driver level routines
  48.  * can use them if they want.)
  49.  *
  50.  * 6 byte command descriptor block, random device
  51.  */
  52. typedef struct cdb_6 {
  53. #if    __BIG_ENDIAN__
  54.     u_int    c6_opcode:8,        /* device command */
  55.         c6_lun:3,        /* logical unit */
  56.         c6_lba:21;        /* logical block number */
  57.     u_char    c6_len;            /* transfer length */
  58.     u_char    c6_ctrl;        /* control byte */
  59.  
  60. #elif    __LITTLE_ENDIAN__
  61.     u_char    c6_opcode;
  62.     u_char    c6_lba2        :5,
  63.         c6_lun        :3;
  64.     u_char    c6_lba1;
  65.     u_char    c6_lba0;
  66.     u_char    c6_len;
  67.     u_char    c6_ctrl;
  68.  
  69. #else
  70. #error    SCSI command / data structures are compiler sensitive
  71. #endif
  72. } cdb_6_t;
  73.  
  74. #define CDB_6_MAX_LENGTH        (255)           /* max block count */
  75. #define CDB_6_MAX_LBA           ((1 << 21) - 1) /* max block address */
  76.  
  77. /*
  78.  * 6 byte command descriptor block, sequential device
  79.  */
  80. typedef struct cdb_6s {
  81. #if    __BIG_ENDIAN__
  82. #if    __NATURAL_ALIGNMENT__
  83.  
  84.     u_char    c6s_opcode:8;        /* device command */
  85.     u_char  c6s_lun:3,        /* logical unit */
  86.         c6s_spare:3,        /* reserved */
  87.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  88.                      *    etc. */ 
  89.     /*
  90.      * Careful, natural alignment...
  91.      */
  92.     u_char     c6s_len[3];         /* transfer length */
  93.     u_char    c6s_ctrl;        /* control byte */
  94.  
  95. #else    __NATURAL_ALIGNMENT__
  96.  
  97.  
  98.     u_char    c6s_opcode:8;        /* device command */
  99.     u_char  c6s_lun:3,        /* logical unit */
  100.         c6s_spare:3,        /* reserved */
  101.         c6s_opt:2;        /* bits 1..0 - space type, fixed, 
  102.                      *    etc. */ 
  103.     u_int    c6s_len:24,        /* transfer length */
  104.         c6s_ctrl:8;        /* control byte */
  105. #endif    __NATURAL_ALIGNMENT__
  106.  
  107.  
  108. #elif    __LITTLE_ENDIAN__
  109.     u_char    c6s_opcode;
  110.     u_char    c6s_opt        :2,
  111.         c6s_spare    :3,
  112.         c6s_lun        :3;
  113.     u_char    c6s_len2;
  114.     u_char    c6s_len1;
  115.     u_char    c6s_len0;
  116.     u_char    c6s_ctrl;
  117.  
  118. #else    
  119. #error    SCSI command / data structures are compiler sensitive
  120. #endif
  121. } cdb_6s_t;
  122.  
  123.  
  124. /*
  125.  * 10 byte command descriptor block
  126.  * This definition is machine dependent due to an int on a short boundary.
  127.  */
  128. typedef struct cdb_10 {
  129. #if    __BIG_ENDIAN__
  130. #if    __NATURAL_ALIGNMENT__
  131.         u_char  c10_opcode;             /* device command */
  132.         u_char  c10_lun:3,              /* logical unit */
  133.                 c10_dp0:1,              /* disable page out */
  134.                 c10_fua:1,              /* force unit access */
  135.                 c10_mbz1:2,             /* reserved: must be zero */
  136.                 c10_reladr:1;           /* addr relative to prev 
  137.                             * linked cmd */
  138.     /*
  139.      * Careful, this can't be an int due to natural alignment...
  140.      */
  141.         u_char    c10_lba[4];             /* logical block number */
  142.         u_char    c10_mbz2:8;          /* reserved: must be zero */
  143.     u_char     c10_len[2];         /* transfer length */
  144.     u_char    c10_ctrl;        /* control byte */
  145.  
  146. #else    __NATURAL_ALIGNMENT__
  147.  
  148.     u_char    c10_opcode;        /* device command */
  149.     u_char    c10_lun:3,        /* logical unit */
  150.         c10_dp0:1,        /* disable page out (cache control) */
  151.         c10_fua:1,        /* force unit access (cache control) */
  152.         c10_mbz1:2,        /* reserved: must be zero */
  153.         c10_reladr:1;        /* addr relative to prev linked cmd */
  154.     u_int    c10_lba;        /* logical block number */
  155.     u_int    c10_mbz2:8,        /* reserved: must be zero */
  156.         c10_len:16,        /* transfer length */
  157.         c10_ctrl:8;        /* control byte */
  158.         
  159. #endif    __NATURAL_ALIGNMENT__
  160. #elif    __LITTLE_ENDIAN__
  161.  
  162.     u_char    c10_opcode;
  163.     u_char    c10_reladr    :1,
  164.         c10_mbz1    :2,
  165.         c10_fua        :1,
  166.         c10_dp0        :1,
  167.         c10_lun        :3;
  168.     u_char    c10_lba3;
  169.     u_char    c10_lba2;
  170.     u_char    c10_lba1;
  171.     u_char    c10_lba0;
  172.     u_char    c10_mbz2;
  173.     u_char    c10_len1;
  174.     u_char    c10_len0;
  175.     u_char    c10_ctrl;
  176.  
  177. #else
  178. #error    SCSI command / data structures are compiler sensitive
  179. #endif
  180. } cdb_10_t;
  181.  
  182. /*
  183.  * 12 byte command descriptor block
  184.  * This definition is machine dependent due to an int on a short boundary.
  185.  */
  186. typedef struct cdb_12 {
  187. #if    __BIG_ENDIAN__
  188. #if    __NATURAL_ALIGNMENT__
  189.  
  190.         u_char    c12_opcode;        /* device command */
  191.         u_char    c12_lun:3,        /* logical unit */
  192.         c12_dp0:1,              /* disable page out */
  193.         c12_fua:1,              /* force unit access */
  194.         c12_mbz1:2,             /* reserved: must be zero */
  195.         c12_reladr:1;           /* addr relative to prev 
  196.                      * linked cmd */
  197.         u_char    c12_lba[4];             /* logical block number */
  198.         u_char    c12_mbz2;         /* reserved: must be zero */
  199.         u_char    c12_mbz3;        /* reserved: must be zero */
  200.         u_char    c12_mbz4;         /* reserved: must be zero */
  201.         u_char    c12_len[2];        /* transfer length */
  202.         u_char    c12_ctrl:8;             /* control byte */
  203.  
  204. #else    __NATURAL_ALIGNMENT__
  205.  
  206.     u_char    c12_opcode;        /* device command */
  207.     u_char    c12_lun:3,        /* logical unit */
  208.         c12_dp0:1,        /* disable page out (cache control) */
  209.         c12_fua:1,        /* force unit access (cache control) */
  210.         c12_mbz1:2,        /* reserved: must be zero */
  211.         c12_reladr:1;        /* addr relative to prev linked cmd */
  212.     u_int    c12_lba;        /* logical block number */
  213.     u_char    c12_mbz2;        /* reserved: must be zero */
  214.     u_char    c12_mbz3;        /* reserved: must be zero */
  215.     u_int    c12_mbz4:8,        /* reserved: must be zero */
  216.         c12_len:16,        /* transfer length */
  217.         c12_ctrl:8;        /* control byte */
  218.  
  219. #endif    __NATURAL_ALIGNMENT__
  220. #elif    __LITTLE_ENDIAN__
  221.  
  222.     u_char    c12_opcode;
  223.     u_char    c12_reladr    :1,
  224.         c12_mbz1    :2,
  225.         c12_fua        :1,
  226.         c12_dp0        :1,
  227.         c12_lun        :3;
  228.     u_char    c12_lba3;
  229.     u_char    c12_lba2;
  230.     u_char    c12_lba1;
  231.     u_char    c12_lba0;
  232.     u_char    c12_mbz2;
  233.     u_char    c12_mbz3;
  234.     u_char    c12_mbz4;
  235.     u_char    c12_len1;
  236.     u_char    c12_len0;
  237.     u_char    c12_ctrl;
  238.  
  239. #else
  240. #error    SCSI command / data structures are compiler sensitive
  241. #endif
  242. } cdb_12_t;
  243.  
  244. typedef union cdb {
  245.     struct    cdb_6    cdb_c6;
  246.     struct  cdb_6s  cdb_c6s;
  247.     struct    cdb_10    cdb_c10;
  248.     struct    cdb_12    cdb_c12;
  249. } cdb_t;
  250.  
  251. #define    cdb_opcode    cdb_c6.c6_opcode    /* all opcodes in same place */
  252.  
  253. /*
  254.  * control byte values
  255.  */
  256. #define    CTRL_LINKFLAG        0x03    /* link and flag bits */
  257. #define    CTRL_LINK        0x01    /* link only */
  258. #define    CTRL_NOLINK        0x00    /* no command linking */
  259.  
  260. /*
  261.  * six byte cdb opcodes
  262.  * (Optional commands should only be used by formatters)
  263.  */
  264. #define    C6OP_TESTRDY        0x00    /* test unit ready */
  265. #define C6OP_REWIND        0x01    /* rewind */
  266. #define    C6OP_REQSENSE        0x03    /* request sense */
  267. #define    C6OP_FORMAT        0x04    /* format unit */
  268. #define    C6OP_REASSIGNBLK    0x07    /* OPT: reassign block */
  269. #define    C6OP_READ        0x08    /* read data */
  270. #define    C6OP_WRITE        0x0a    /* write data */
  271. #define    C6OP_SEEK        0x0b    /* seek */
  272. #define C6OP_READREV        0x0F    /* read reverse */
  273. #define C6OP_WRTFM        0x10    /* write filemarks */
  274. #define C6OP_SPACE        0x11    /* space records/filemarks */
  275. #define    C6OP_INQUIRY        0x12    /* get device specific info */
  276. #define C6OP_VERIFY        0x13    /* sequential verify */
  277. #define    C6OP_MODESELECT        0x15    /* OPT: set device parameters */
  278. #define    C6OP_MODESENSE        0x1a    /* OPT: get device parameters */
  279. #define    C6OP_STARTSTOP        0x1b    /* OPT: start or stop device */
  280. #define    C6OP_SENDDIAG        0x1d    /* send diagnostic */
  281.  
  282. /*
  283.  * ten byte cdb opcodes
  284.  */
  285. #define    C10OP_READCAPACITY    0x25    /* read capacity */
  286. #define    C10OP_READEXTENDED    0x28    /* read extended */
  287. #define    C10OP_WRITEEXTENDED    0x2a    /* write extended */
  288. #define    C10OP_READDEFECTDATA    0x37    /* OPT: read media defect info */
  289.  
  290.  
  291. /*
  292.  *    c6s_opt - options for 6-byte sequential device commands 
  293.  */
  294.  
  295. #define C6OPT_FIXED        0x01    /* fixed block transfer */
  296. #define C6OPT_LONG        0x01    /* 1 = erase to EOT */
  297. #define C6OPT_IMMED        0x01    /* immediate (for rewind, retension) */
  298. #define C6OPT_BYTECMP        0x02    /* byte compare for C6OP_VERIFY */
  299. #define C6OPT_SIL        0x02    /* suppress illegal length (Exabyte) */
  300. #define C6OPT_SPACE_LB        0x00    /* space logical blocks */
  301. #define C6OPT_SPACE_FM        0x01    /* space filemarks */
  302. #define C6OPT_SPACE_SFM        0x02    /* space sequential filemarks */
  303. #define C6OPT_SPACE_PEOD    0x03    /* space to physical end of data */    
  304.  
  305. /*    
  306.  *    other 6-byte sequential command constants
  307.  */
  308.  
  309. #define C6S_MAXLEN        0xFFFFFF    
  310. #define C6S_RETEN        0x02    /* byte 4 of load/unload - retension */
  311. #define C6S_LOAD        0x01    /* byte 4 of load/unload - load */
  312.  
  313. /*
  314.  * these go in the c6_len fields of start/stop command
  315.  */
  316. #define C6S_SS_START        0x01    /* start unit */
  317. #define C6S_SS_STOP        0x00    /* stop unit */
  318. #define C6S_SS_EJECT        0x02    /* eject disk */
  319.  
  320. /*
  321.  * extended sense data
  322.  * returned by C6OP_REQSENSE
  323.  */
  324. typedef struct esense_reply {
  325. #if    __BIG_ENDIAN__
  326.  
  327.     u_char    er_ibvalid:1,        /* information bytes valid */
  328.         er_class:3,        /* error class */
  329.         er_code:4;        /* error code */
  330.     u_char    er_segment;        /* segment number for copy cmd */
  331.     u_char    er_filemark:1,        /* file mark */
  332.         er_endofmedium:1,    /* end-of-medium */
  333.         er_badlen:1,        /* incorrect length */
  334.         er_rsvd2:1,        /* reserved */
  335.         er_sensekey:4;        /* sense key */
  336.     u_char    er_infomsb;        /* MSB of information byte */
  337.     u_int    er_info:24,        /* bits 23 - 0 of info "byte" */
  338.         er_addsenselen:8;    /* additional sense length */
  339.     u_int    er_rsvd8;        /* copy status (unused) */
  340.     u_char    er_addsensecode;    /* additional sense code */
  341.     
  342.     /* the following are used for tape only as of 27-Feb-89 */
  343.     
  344.     u_char    er_qualifier;        /* sense code qualifier */
  345.     u_char  er_rsvd_e;
  346.     u_char  er_rsvd_f;
  347.     u_int   er_err_count:24,    /* three bytes of data error counter */
  348.         er_stat_13:8;        /* byte 0x13 - discrete status bits */
  349.     u_char  er_stat_14;        /* byte 0x14 - discrete status bits */
  350.     u_char  er_stat_15;        /* byte 0x15 - discrete status bits */
  351.     
  352. #if    __NATURAL_ALIGNMENT__
  353.  
  354.     u_char    er_rsvd_16;
  355.     u_char    er_remaining[3];    /* bytes 0x17..0x19 - remaining tape */
  356.  
  357. #else    __NATURAL_ALIGNMENT__
  358.  
  359.     u_int   er_rsvd_16:8,
  360.         er_remaining:24;    /* bytes 0x17..0x19 - remaining tape */
  361.  
  362. #endif    __NATURAL_ALIGNMENT__
  363.  
  364. #elif    __LITTLE_ENDIAN__
  365.  
  366.     u_char    er_code        :4,
  367.         er_class    :3,
  368.         er_ibvalid    :1;
  369.     u_char    er_segment;
  370.     u_char    er_sensekey    :4,
  371.         er_rsvd2    :1,
  372.         er_badlen    :1,
  373.         er_endofmedium    :1,
  374.         er_filemark    :1;
  375.     u_char    er_info3;
  376.     u_char    er_info2;
  377.     u_char    er_info1;
  378.     u_char    er_info0;
  379.     u_char    er_addsenselen;
  380.     u_char    er_rsvd8[4];
  381.     u_char    er_addsensecode;
  382.  
  383.     u_char    er_qualifier;
  384.     u_char    er_rsvd_e;
  385.     u_char    er_rsvd_f;
  386.     u_char    er_err_count2;
  387.     u_char    er_err_count1;
  388.     u_char    er_err_count0;
  389.     u_char    er_stat_13;
  390.     u_char    er_stat_14;
  391.     u_char    er_stat_15;
  392.     u_char    er_rsvd_16;
  393.     u_char    er_remaining2;
  394.     u_char    er_remaining1;
  395.     u_char    er_remaining0;
  396.  
  397. #else
  398. #error    SCSI command / data structures are compiler sensitive
  399. #endif
  400.         
  401.     /* technically, there can be additional bytes of sense info
  402.      * here, but we don't check them, so we don't define them
  403.      */
  404. } esense_reply_t;
  405.  
  406. /*
  407.  * sense keys
  408.  */
  409. #define    SENSE_NOSENSE        0x0    /* no error to report */
  410. #define    SENSE_RECOVERED        0x1    /* recovered error */
  411. #define    SENSE_NOTREADY        0x2    /* target not ready */
  412. #define    SENSE_MEDIA        0x3    /* media flaw */
  413. #define    SENSE_HARDWARE        0x4    /* hardware failure */
  414. #define    SENSE_ILLEGALREQUEST    0x5    /* illegal request */
  415. #define    SENSE_UNITATTENTION    0x6    /* drive attention */
  416. #define    SENSE_DATAPROTECT    0x7    /* drive access protected */
  417. #define    SENSE_ABORTEDCOMMAND    0xb    /* target aborted command */
  418. #define    SENSE_VOLUMEOVERFLOW    0xd    /* eom, some data not transfered */
  419. #define    SENSE_MISCOMPARE    0xe    /* source/media data mismatch */
  420.  
  421. /*
  422.  * inquiry data
  423.  */
  424. typedef struct inquiry_reply {
  425.  
  426. #if    __BIG_ENDIAN__
  427.  
  428.     u_char    ir_qual:3,        /* qualifier */
  429.         ir_devicetype:5;    /* device type, see below */
  430.     u_char    ir_removable:1,        /* removable media */
  431.         ir_typequalifier:7;    /* device type qualifier */
  432.     u_char    ir_isoversion:2,    /* ISO  version number */
  433.         ir_ecmaversion:3,    /* ECMA version number */
  434.         ir_ansiversion:3;    /* ANSI version number */
  435.     u_char    ir_zero2:4,        /* reserved */
  436.         ir_rspdatafmt:4;    /* response data format */
  437.     u_char    ir_addlistlen;        /* additional list length */
  438.     u_char    ir_zero3[2];        /* reserved */
  439.     u_char    ir_reladr:1,        /* relative addressing */
  440.         ir_wbus32:1,        /* 32-bit wide data transfers */
  441.         ir_wbus16:1,        /* 16-bit wide data transfers */
  442.         ir_sync:1,        /* synchronous data transfers */
  443.         ir_linked:1,        /* linked commands */
  444.         ir_zero4:1,        /* reserved */
  445.         ir_cmdque:1,        /* tagged command queuing */
  446.         ir_sftre:1;        /* soft reset */
  447.     char    ir_vendorid[8];        /* vendor name in ascii */
  448.     char    ir_productid[16];    /* product name in ascii */
  449.     char    ir_revision[4];        /* revision level info in ascii */
  450.     char    ir_misc[28];        /* misc info */
  451.     char    ir_endofid[1];        /* just a handle for end of id info */
  452.  
  453. #elif    __LITTLE_ENDIAN__
  454.  
  455.     u_char    ir_devicetype    :5,
  456.         ir_qual        :3;
  457.     u_char    ir_typequalifier:7,
  458.         ir_removable    :1;
  459.     u_char    ir_ansiversion    :3,
  460.         ir_ecmaversion    :3,
  461.         ir_isoversion    :2;
  462.     u_char    ir_rspdatafmt    :4,
  463.         ir_zero2    :4;
  464.     u_char    ir_addlistlen;
  465.     u_char    ir_zero3[2];
  466.     u_char    ir_sftre    :1,
  467.         ir_cmdque    :1,
  468.         ir_zero4    :1,
  469.         ir_linked    :1,
  470.         ir_sync        :1,
  471.         ir_wbus16    :1,
  472.         ir_wbus32    :1,
  473.         ir_reladr    :1;
  474.     u_char    ir_vendorid[8];
  475.     u_char    ir_productid[16];
  476.     u_char    ir_revision[4];
  477.     u_char    ir_misc[28];
  478.     u_char    ir_endofid[1];
  479.  
  480. #else
  481. #error    SCSI command / data structures are compiler sensitive
  482. #endif
  483. } inquiry_reply_t;
  484.  
  485. #define    DEVQUAL_OK        0x00    /* device is connected to this lun */
  486. #define    DEVQUAL_MIA        0x01    /* device not connected to lun */
  487. #define    DEVQUAL_RSVD        0x02    /* reserved */
  488. #define    DEVQUAL_NODEV        0x03    /* target doesn't support dev on lun */
  489. #define    DEVQUAL_VUMASK        0x04    /* 1XXb is vendor specific */
  490.  
  491.  
  492. #define    DEVTYPE_DISK        0x00    /* read/write disks */
  493. #define    DEVTYPE_TAPE        0x01    /* tapes and other sequential devices*/
  494. #define    DEVTYPE_PRINTER        0x02    /* printers */
  495. #define    DEVTYPE_PROCESSOR    0x03    /* cpu's */
  496. #define    DEVTYPE_WORM        0x04    /* write-once optical disks */
  497. #define    DEVTYPE_CDROM        0x05    /* cd rom's, etc */
  498. #define DEVTYPE_SCANNER        0x06
  499. #define DEVTYPE_OPTICAL        0x07    /* other optical storage */
  500. #define DEVTYPE_CHANGER        0x08    /* jukebox */
  501. #define DEVTYPE_COMM        0x09    /* communication device */
  502. #define DEVTYPE_GRAPH_A        0x0a    /* ASC IT8 graphics */
  503. #define DEVTYPE_GRAPH_B        0x0b    /* ASC IT8 graphics */
  504. #define DEVTYPE_NOTPRESENT      0x1f    /* logical unit not present */
  505.  
  506. /*
  507.  * read capacity reply
  508.  */
  509. typedef struct capacity_reply {
  510.  
  511. #if    __BIG_ENDIAN__
  512.  
  513.     u_int    cr_lastlba;        /* last logical block address */
  514.     u_int    cr_blklen;        /* block length */
  515.  
  516. #elif    __LITTLE_ENDIAN__
  517.  
  518.     u_char    cr_lastlba3;
  519.     u_char    cr_lastlba2;
  520.     u_char    cr_lastlba1;
  521.     u_char    cr_lastlba0;
  522.  
  523.     u_char    cr_blklen3;
  524.     u_char    cr_blklen2;
  525.     u_char    cr_blklen1;
  526.     u_char    cr_blklen0;
  527.  
  528. #else
  529. #error    SCSI command / data structures are compiler sensitive
  530. #endif
  531. } capacity_reply_t;
  532.  
  533. /*
  534.  * Standard Mode Select/Mode Sense data structures
  535.  */
  536.  
  537. typedef struct mode_sel_hdr {
  538.  
  539. #if    __BIG_ENDIAN__
  540.  
  541.     u_char         msh_sd_length_0;    /* byte 0 - length (mode sense
  542.                          *    only)  */
  543.     u_char        msh_med_type;        /* medium type - random access
  544.                          *   devices only */
  545.     u_char        msh_wp:1,        /* byte 2 bit 7 - write protect
  546.                          *   mode sense only) */
  547.             msh_bufmode:3,        /* buffered mode - sequential
  548.                          *   access devices only */
  549.             msh_speed:4;        /* speed - sequential access
  550.                          *   devices only */
  551.     u_char        msh_bd_length;        /* block descriptor length */
  552.  
  553. #elif    __LITTLE_ENDIAN__
  554.  
  555.     u_char        msh_sd_length_0;
  556.     u_char        msh_med_type;
  557.     u_char        msh_speed    :4,
  558.             msh_bufmode    :3,
  559.             msh_wp        :1;
  560.     u_char        msh_bd_length;
  561.  
  562. #else
  563. #error    SCSI command / data structures are compiler sensitive
  564. #endif
  565. } mode_sel_hdr_t;
  566.  
  567. typedef struct mode_sel_bd {                /* block descriptor */
  568.  
  569. #if    __BIG_ENDIAN__
  570.  
  571.     u_int        msbd_density:8,
  572.             msbd_numblocks:24;
  573.     u_int        msbd_rsvd_0:8,        /* byte 4 - reserved */
  574.             msbd_blocklength:24;
  575.  
  576. #elif    __LITTLE_ENDIAN__
  577.  
  578.     u_char        msbd_density;
  579.     u_char        msbd_numblocks2;
  580.     u_char        msbd_numblocks1;
  581.     u_char        msbd_numblocks0;
  582.     u_char        msbd_rsvd_0;
  583.     u_char        msbd_blocklength2;
  584.     u_char        msbd_blocklength1;
  585.     u_char        msbd_blocklength0;
  586.  
  587. #else
  588. #error    SCSI command / data structures are compiler sensitive
  589. #endif
  590. } mode_sel_bd_t;
  591.  
  592. #define MODSEL_DATA_LEN    0x30
  593.  
  594. typedef struct mode_sel_data {
  595.  
  596.     /* transferred to/from target during mode select/mode sense */
  597.     struct mode_sel_hdr msd_header;
  598.     struct mode_sel_bd  msd_blockdescript;
  599.     u_char msd_vudata[MODSEL_DATA_LEN];    /* for vendor unique data */
  600. } mode_sel_data_t;
  601.  
  602. /* 
  603.  * struct for MTIOCMODSEL/ MTIOCMODSEN
  604.  */
  605. typedef struct modesel_parms {
  606.     struct mode_sel_data    msp_data;
  607.     int            msp_bcount;    /* # of bytes to DMA */
  608. } modesel_parms_t;
  609.  
  610. /*
  611.  * Day-to-day constants in the SCSI world
  612.  */
  613. #define    SCSI_NTARGETS    8        /* 0 - 7 for target numbers */
  614. #define    SCSI_NLUNS    8        /* 0 - 7 luns for each target */
  615.  
  616. /*
  617.  * Defect list header
  618.  * Used by FORMAT and REASSIGN BLOCK commands
  619.  */
  620. struct defect_header {
  621.  
  622. #if    __BIG_ENDIAN__
  623.  
  624.     u_char    dh_mbz1;
  625.     u_char    dh_fov:1,        /* format options valid */
  626.         dh_dpry:1,        /* disable primary */
  627.         dh_dcrt:1,        /* disable certification */
  628.         dh_stpf:1,        /* stop format */
  629.         dh_mbz2:4;
  630.     u_short    dh_len;            /* items in defect list */
  631.  
  632. #elif    __LITTLE_ENDIAN__
  633.  
  634.     u_char    dh_mbz1;
  635.     u_char    dh_mbz2        :4,
  636.         dh_stpf        :1,
  637.         dh_dcrt        :1,
  638.         dh_dpry        :1,
  639.         dh_fov        :1;
  640.     u_char    dh_len1;
  641.     u_char    dh_len0;
  642.  
  643. #else
  644. #error    SCSI command / data structures are compiler sensitive
  645. #endif
  646. };
  647.  
  648. /*
  649.  * Status for scsi_req (see below).
  650.  */
  651. typedef enum {
  652.     
  653.     SR_IOST_GOOD    = 0,        /* successful */
  654.     SR_IOST_SELTO    = 1,        /* selection timeout */
  655.     SR_IOST_CHKSV    = 2,        /* check status, sr_esense */
  656.                     /*    valid */
  657.     SR_IOST_CHKSNV    = 3,        /* check status, sr_esense */
  658.                     /*    not valid */
  659.     SR_IOST_DMAOR    = 4,        /* target attempted to move */
  660.                     /*    more than sr_dma_max */
  661.                     /*    bytes */
  662.     SR_IOST_IOTO    = 5,        /* sr_ioto exceeded */
  663.     SR_IOST_BV    = 6,        /* SCSI Bus violation */
  664.     SR_IOST_CMDREJ    = 7,        /* command reject (by 
  665.                      *    driver) */
  666.     SR_IOST_MEMALL    = 8,        /* memory allocation failure */
  667.     SR_IOST_MEMF    = 9,        /* memory fault */
  668.     SR_IOST_PERM    = 10,        /* not super user */
  669.     SR_IOST_NOPEN    = 11,        /* device not open */
  670.     SR_IOST_TABT    = 12,        /* target aborted command */
  671.     ST_IOST_BADST    = 13,        /* bad SCSI status byte  */
  672.                     /*  (other than check status)*/
  673. #define    SR_IOST_BADST    ST_IOST_BADST
  674.     ST_IOST_INT    = 14,        /* internal driver error */
  675. #define    SR_IOST_INT    ST_IOST_INT
  676.     SR_IOST_BCOUNT    = 15,        /* unexpected byte count */
  677.                     /* seen on SCSI bus */ 
  678.     SR_IOST_VOLNA    = 16,        /* desired volume not available */
  679.     SR_IOST_WP    = 17,        /* Media Write Protected */
  680.     SR_IOST_ALIGN    = 18,        /* DMA alignment error */
  681.     SR_IOST_IPCFAIL = 19,        /* Mach IPC failure */
  682.     SR_IOST_RESET    = 20,        /* bus was reset during 
  683.                      * processing of command */
  684.     SR_IOST_PARITY    = 21,        /* SCSI Bus Parity Error */
  685.     SR_IOST_HW    = 22,        /* Gross Hardware Failure */
  686.     SR_IOST_DMA    = 23,        /* DMA error */
  687.     SR_IOST_INVALID    = 100,        /* should never be seen */
  688. } sc_status_t;
  689.  
  690. /*
  691.  * DMA Direction.
  692.  */
  693. typedef enum {
  694.     SR_DMA_RD = 0,            /* DMA from device to host */
  695.     SR_DMA_WR = 1,            /* DMA from host to device */
  696. } sc_dma_dir_t;
  697.  
  698. /*
  699.  * SCSI Request used by sg driver via SGIOCREQ and internally in st driver
  700.  */
  701.  
  702. typedef struct scsi_req {
  703.  
  704.     /*** inputs ***/
  705.     
  706.     cdb_t            sr_cdb;        /* command descriptor block - 
  707.                          * one of three formats */
  708.     sc_dma_dir_t        sr_dma_dir;    /* DMA direction */
  709.     caddr_t            sr_addr;    /* memory addr for data 
  710.                          * transfers */
  711.     int            sr_dma_max;    /* maximum number of bytes to
  712.                          * transfer */
  713.     int            sr_ioto;    /* I/O timeout in seconds */
  714.                          
  715.     /*** outputs ***/
  716.     
  717.     int            sr_io_status;    /* driver status */
  718.     u_char            sr_scsi_status;    /* SCSI status byte */
  719.     esense_reply_t         sr_esense;    /* extended sense in case of
  720.                          * check status */
  721.     int            sr_dma_xfr;    /* actual number of bytes 
  722.                          * transferred by DMA */
  723.     struct    timeval        sr_exec_time;    /* execution time in 
  724.                          * microseconds */
  725.                          
  726. #if    m68k
  727.  
  728.     /*** for driver's internal use ***/
  729.     
  730.     u_char            sr_flags;
  731.     queue_chain_t        sr_io_q;    /* for linking onto sgdp->
  732.                          *    sdg_io_q */
  733. #else    m68k
  734.  
  735.     u_char            sr_cdb_length;    /* length of CDB bytes 
  736.                          *    (optional) */
  737.  
  738.     /*
  739.      * Flags to disable disconnect, command queueing, synchronous transfer
  740.      * negotiation.
  741.      */
  742.     u_char            sr_discon_disable:1,
  743.                 sr_cmd_queue_disable:1,
  744.                 sr_sync_disable:1,
  745.                 sr_pad1:5;
  746.     u_char            sr_pad2;
  747.                     
  748.     u_char            sr_flags;    /* driver private */
  749.     queue_chain_t        sr_io_q;
  750.     
  751. #endif    m68k
  752.  
  753. } scsi_req_t;
  754.  
  755. typedef struct scsi_adr {
  756.  
  757.     u_char            sa_target;
  758.     u_char            sa_lun;
  759.     
  760. } scsi_adr_t;
  761.  
  762.  
  763. /*
  764.  *    Generic SCSI ioctl requests
  765.  */
  766.  
  767. #define SGIOCSTL    _IOW ('s', 0, struct scsi_adr)    /* set target/lun */
  768. #define    SGIOCREQ    _IOWR('s', 1, struct scsi_req)     /* cmd request */
  769. #define SGIOCENAS    _IO(  's', 2)             /* enable autosense */
  770. #define SGIOCDAS    _IO(  's', 3)            /* disable autosense */
  771. #define SGIOCRST    _IO(  's', 4)            /* reset SCSI bus */
  772. #define SGIOCCNTR       _IOW( 's', 6, int)              /* select controller */
  773.  
  774. /*
  775.  *    ioctl requests specific to SCSI disks
  776.  */
  777. #define    SDIOCSRQ    _IOWR('s', 1, struct scsi_req)     /* cmd request using */
  778.                             /* struct scsi_req */
  779.  
  780. #define SDIOCGETCAP    _IOR  ('s', 5, struct capacity_reply)
  781.                             /* Get Read 
  782.                              * Capacity info */
  783.  
  784. /* 
  785.  *    ioctl requests specific to SCSI tapes 
  786.  */
  787.  
  788. #define    MTIOCFIXBLK    _IOW('m', 5, int )    /* set fixed block mode */
  789. #define MTIOCVARBLK     _IO('m',  6)        /* set variable block mode */
  790. #define MTIOCMODSEL    _IOW('m', 7, struct modesel_parms)    
  791.                         /* mode select */
  792. #define MTIOCMODSEN    _IOWR('m',8, struct modesel_parms)    
  793.                         /* mode sense */
  794. #define MTIOCINILL    _IO('m',  9)        /* inhibit illegal length */
  795.                         /*    errors */
  796. #define MTIOCALILL    _IO('m',  10)        /* allow illegal length */
  797.                         /*    errors */
  798. #define    MTIOCSRQ    _IOWR('m', 11, struct scsi_req)     
  799.                         /* cmd request using 
  800.                          * struct scsi_req */
  801.  
  802.  
  803. #endif _BSD_DEV_SCSIREG_
  804.  
  805.